package com.wy.tingshu.servlet.publish;

import com.wy.tingshu.util.DBUtil;
import com.wy.tingshu.util.Log;
import lombok.SneakyThrows;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * 公开的页面，普通用户可直接看到
 * 音频播放功能：1.提供音频数据的URL；2.统一的数据接口
 **/
//1.提供音频数据的URL；
@WebServlet("/track")
public class TrackServlet extends HttpServlet {
    @SneakyThrows
    @Override
    //根据音频tid选择音频类型type和内容content
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String tid = req.getParameter("tid");
        String type;
        InputStream content;
        try (Connection c= DBUtil.connection()){
            String sql="select type,content from tracks where tid=?";
            try (PreparedStatement ps=c.prepareStatement(sql)){
                ps.setString(1,tid);
                Log.println("执行SQL:"+ps);
                try (ResultSet rs=ps.executeQuery()){//一个tid对应唯一音频，只有一个无需循环
                    if(!rs.next()){
                        throw new RuntimeException("tid对应的音频不存在 404");
                    }
                    type=rs.getString("type");
                    content=rs.getBinaryStream("content");

                }
            }
        }
        //这里的响应不是文本而是二进制，所以不需要设置字符集
        resp.setContentType(type);
        //写二进制响应，不用resp.getWriter(),而是用resp.getOutputStream()
        ServletOutputStream os = resp.getOutputStream();
        //把数据从content(InputStream)搬到os(OutputStream)
        //用到IO中学过的，利用一个桶(byte[])一点点搬，直到数据搬完
        byte[] buf=new byte[4096];
        while (true){
            int n=content.read(buf);
            if(n==-1){
                //内容搬完了，退出循环
                break;
            }
            //不为-1时，将数据放入os
            os.write(buf,0,n);
        }
        os.flush();
        content.close();
    }
}
